
import 'dart:isolate';
import 'dart:async';
import 'package:flutter/material.dart';

class TestIsolate extends StatefulWidget {
  const TestIsolate({super.key});

  @override
  _TestIsolateState createState() => _TestIsolateState();
}

class _TestIsolateState extends State<TestIsolate> {
 late final ThemeData _themeData = Theme.of(context);
 var content = "点击计算按钮,开始计算";
 Future<void> testIsolate()async{
   // 这两个是主线程的接收跟发送器
   ReceivePort mainRcPort = ReceivePort();
   SendPort mainSdPort = mainRcPort.sendPort;

   // 创建一个isolate
   Isolate newIsolate = await Isolate.spawn(doWork, mainSdPort);
   
    SendPort? port2;

    // 多个rcport传递的操作，以及不用listen 使用first获取第一个参数，简化写法
   // 不用listen 直接用first可以直接监听传递过来的第一个参数
   // int status =await mainRcPort.first as int;
   // 这样就可以不用写listen，还可以把传递信息的rcport根据作用区分
   // 存储新创建的isolate传递的sendport的时候用 savePortRcPort,
   // 用来传递处理结果数据的port可以用 answerRcPort
   // 把answerRcPort传递给新创建的isolate，等他处理结束的时候，再把结果传递回来就行了，
   // 然后主线程也不用listen，直接用  answerRcPort.first as result 就行了


   mainRcPort.listen((message) { 
     print("主线程接收到信息了：${message}");


     // 如果等于0 证明是新建的isolate传过来的 把新创建的isolate的sendport存起来
     if(message[0] == 0){
        port2 = message[1];
     }else if(message[0] == 2){
       // 操作完成，杀死这个进程
       newIsolate.kill();
     } else {
       if(port2 != null){
         print("由 主线程isolate 调用新创建的isolate的sendport方法");
         // 1,存储port2了，因为已经存过了，
         port2?.send([1,"这条信息是 由主线程isolate 调用存储过的port2来发送的信息"]);
       }
     }

   });

   print("port1-- 主线程islate 发送消息操作");
   mainSdPort.send([1,"这条信息是主线程isolate 通过调用主线程的sendport方法发送的消息"]);
   // newIsolate.kill();



 }

 static Future<void> doWork(SendPort mainSdPort)async{
  ReceivePort rp2 = ReceivePort();
  SendPort sp2 = rp2.sendPort;
  
  rp2.listen((message) { 
    
    print("新创建的isolate接收到的信息: ${message}");
  });
   // 将新创建的isolate的sendport 发送到主线程isolate中，用于互相通信
   mainSdPort.send([0,sp2]);
   //模拟耗时5s
  await Future.delayed(Duration(seconds: 5));
   mainSdPort.send([1,"这条消息是 新创建的isoloate调用传递过来的mainSendPort发送回主线程的msg"]);
  sp2.send([1,"这条消息是 在新创建的isolate里面调用sendport2 发送的"]);
  await Future.delayed(Duration(seconds: 5));
  // 操作完成，kill这个进程
   mainSdPort.send([2,"操作结束，杀死这个创建的线程isolate"]);
 }

 @override
  void initState() {
    // TODO: implement initState
   testIsolate();
    super.initState();
  }
 @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:AppBar(
        title: Text("测试 isolate",),
      ),
      body: SafeArea(
        child: Center(
          child: Column(
            children: <Widget>[
              Container(
                  width: double.infinity, height: 500, child: Text(content)),
              TextButton(
                child: Text('计算'),
                onPressed: () {
                  // int result = sum(100000000000);
                  // content = "总和$result";
                  // setState(() {});
                },
              )
            ],
          ),
        ),

      ),
    );
  }
 //计算0到 num 数值的总和[0
 int sum(int num) {
   int count = 0;
   while (num > 0) {
     count = count + num;
     num--;
   }
   return count;
 }
}
